home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 3 / AGA Experience Volume 3 (1997)(NFA - SAdENESS)[!].iso / software / utilities / graphics / raylab / source / camera.c < prev    next >
C/C++ Source or Header  |  1996-07-09  |  2KB  |  60 lines

  1. /*
  2.     name:    camera.c
  3.  
  4.     Camera-routines
  5.     ---------------
  6.  
  7.     These routines are used for handling the camera (positioning,
  8.     rotation etc).
  9.  
  10.  
  11.     This source-code is part of the RayLab 1.1 package, and it is provided
  12.     for your compiling pleasure.  You may use it, change it, re-compile it
  13.     etc., as long as nobody else but you receive the changes/compilations
  14.     that you have made!
  15.  
  16.     You may not use any part(s) of this source-code for your own productions
  17.     without the permission from the author of RayLab. Please read the legal
  18.     information found in the users documentation for RayLab for more details.
  19.  
  20. */
  21.  
  22.  
  23. #include  "defs.h"
  24.  
  25.  
  26. void CreateCamera(CAMERA *Camera, POINT *Loc, POINT *VP, VECTOR *Asp)
  27. {
  28.     double    costheta;
  29.     VECTOR    D,R,U;
  30.  
  31.     D.x=(VP->x-Loc->x);            /* Calculate direction-vector */
  32.     D.y=(VP->y-Loc->y);
  33.     D.z=(VP->z-Loc->z);
  34.     NormalizeVector(&D,&D);            /* Make direction-vector unit-sized */
  35.                         /* This is important for the calcu- */
  36.                         /* lations of the up- and right-    */
  37.                         /* vectors!                         */
  38.  
  39.     costheta=cos(asin(D.z));        /* Calculate right-vector */
  40.     if(fabs(costheta)>0.0) {
  41.         R.x=D.y/costheta;            /* "/cos(theta)" => |R| = 1 */
  42.         R.y=-(D.x/costheta);
  43.         R.z=0.0;
  44.     }
  45.     else {
  46.         R.x=1.0; R.y=0.0; R.z=0.0;        /* (looking straight up or down) */
  47.     }
  48.  
  49.     CrossProduct(&U,&R,&D);            /* U = R x D */
  50.  
  51.     Camera->Location=*Loc;            /* Declare camera location */
  52.     Camera->ViewPoint=*VP;            /* Declare view-point */
  53.     Camera->Aspect=*Asp;            /* Declare camera aspect */
  54.     Camera->Direction=D;            /* Declare camera direction */
  55.     Camera->Up=U;                /* Declare camera up-vector */
  56.     Camera->Right=R;            /* Declare camera right-vector */
  57.  
  58. }
  59.  
  60.